package com.itcam.pro03list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author : Cammy.Wu
 * Description : 
 */

/*
    列表（list）是一个抽象的数据结构概念，它表示元素的有序集合，支持元素访问、修改、添加、删除和遍历等操作，无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。

        * 链表天然可以看作一个列表，其支持元素增删查改操作，并且可以灵活动态扩容。
        * 数组也支持元素增删查改，但由于其长度不可变，因此只能看作一个具有长度限制的列表。

        当使用数组实现列表时，长度不可变的性质会导致列表的实用性降低。这是因为我们通常无
            法事先确定需要存储多少数据，从而难以选择合适的列表长度。若长度过小，则很可能
            无法满足使用需求；若长度过大，则会造成内存空间浪费。
 */

public class ListTest01 {
    public static void main(String[] args) {
        /* 初始化列表 */
        // 无初始值
        List<Integer> nums1 = new ArrayList<>();
        // 有初始值（注意数组的元素类型需为 int[] 的包装类 Integer[]）
        Integer[] numbers = new Integer[]{1, 3, 2, 5, 4};
        List<Integer> nums = new ArrayList<>(Arrays.asList(numbers));

        /* 访问元素 */
        System.out.println(nums.get(1));  // 访问索引 1 处的元素
        /* 通过索引遍历列表 */
        f(nums);

        /* 更新元素 */
        nums.set(1, 0);  // 将索引 1 处的元素更新为 0
        f(nums);

        /* 清空列表 */
        nums.clear();
        f(nums);

        /* 在尾部添加元素 */
        nums.add(1);
        nums.add(3);
        nums.add(2);
        nums.add(5);
        nums.add(4);
        f(nums);

        /* 在中间插入元素 */
        nums.add(3, 6);  // 在索引 3 处插入数字 6
        f(nums);

        /* 删除元素 */
        nums.remove(3);  // 删除索引 3 处的元素
        f(nums);

        /* 拼接两个列表 */
        nums1 = new ArrayList<>(Arrays.asList(new Integer[]{6, 8, 7, 10, 9}));
        nums.addAll(nums1);  // 将列表 nums1 拼接到 nums 之后
        f(nums);

        /* 排序列表 */
        Collections.sort(nums);  // 排序后，列表元素从小到大排列
        f(nums);
    }

    /**
     * 直接遍历列表元素
     * @param nums
     */
    private static void f(List<Integer> nums) {
        int count = 0;

        /* 直接遍历列表元素 */
        for (int num : nums) {
            count += num;
            System.out.print(num + " ");
        }

        System.out.println();
    }
}
